\begin{Exercise}[title={数字游戏},difficulty=2]
\label{ex:numbercruncher}
\begin{itemize}
\item{从列表中随机选择六个数字：
$$1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 75, 100$$
数字可以多次被选中；}
\item{从 $1 \ldots 1000$ 中选择一个随机数 $i$；}
\item{尝试用先前的六个数字（或者其中的几个）配合运算符 $+$，$-$，$*$和$/$，计算出 $i$；}
\end{itemize}
例如，选择了数字：1，6，7，8，8 和 75。并且 $i$ 为 977。
可以用许多方法来实现，其中一种：
$$ ((((1 * 6) * 8) + 75) * 8) - 7 = 977$$ 
或者
$$ (8*(75+(8*6)))-(7/1) = 977$$

\Question\label{ex:cruncher q1}
实现像这样的数字游戏。使其打印像上面那样格式的结果（也就是说，输出应当是带有括号的中序表达式）
\Question\label{ex:cruncher q2}
计算\emph{全部}可能解，并且全部显示出来（或者仅显示有多少个）。在上面的例子中，有 544 种方法。
\end{Exercise}

\begin{Answer}
\Question 
下面的是一种可能的解法。它使用了递归和回溯来得到答案。
\lstinputlisting[caption=数字游戏]{ex-communication/src/permrec.go}

\Question
开始运行 \prog{permrec} 时，输入 977 作为第一个参数：
\vspace{1em}
\begin{display}
\pr ./permrec 977
1+(((6+7)*75)+(8/8)) = 977  #1
...                         ...
((75+(8*6))*8)-7 = 977      #542
(((75+(8*6))*8)-7)*1 = 977  #543
(((75+(8*6))*8)-7)/1 = 977  #544
\end{display}

\end{Answer}
